上一篇文章簡單的在Global.asax裡測試了利用MSNPSharp來實作MSN登入、發訊息的簡單功能,這一篇就讓我們進一步來把這些功能獨立到新的類別檔案中吧!
第5步的程式碼很重要,因為我最早在測試的時候就是因為沒有那行程式碼,結果看不到MSN機器人上線,發送訊息好像也無效。
因為MSNPSharp給我的感覺比較像類似.Net Framework這類屬於較底層的API,所以我想了想才會決定應該要自己寫一個類別將它再包起來,因為光是登入後需要透過它所引發的事件讓MSN實際上登入看得到就有些程式碼要寫了,更不用說其它的使用情況了。
在程式中目前設計了兩個多載的建構函式,一個是單純輸入帳號密碼就可以連線,預設的狀態是Online,但是另一個多載的函式可以讓使用者自行決定一開始登入的時候的狀態,也就是說可以隱藏登入,像Yahoo即時通那樣。
除此之外也設計了一個Account的唯讀屬性,會設計成唯讀是稍微想了一下,因為是機器人,雖然程式可以寫成修改帳號密碼之後再重新登入別的帳號,但是這麼做不如將原本的執行個體釋放後重新New一個,這樣可以讓事情較單純些,在Server上同時Host多個MSN機器人的時候也會需要知道當前的Instance是哪一個MSN機器人,所以會有讀取Account的需求。
透過GetContactStatus可以顯示某個聯絡人的上線狀態,可以在網頁上就知道誰是否在線上。
1.在App_Code中建立一個新的Class,命名為MSNRobot。
2.匯入MSNPSharp命名空間。
Imports MSNPSharp
3.在MSNRobot Class寫一個新的列舉,命名為OnlineStatusEnum,這部份事實上完全是參加MSNPSharp中的PresenceStatus列舉,這麼做的原因是打算完全把MSNPSharp包起來。
'上線狀態
Enum OnlineStatusEnum
Away = 4
BRB = 6
Busy = 5
Hidden = 2
Idle = 9
Lunch = 7
Offline = 1
Online = 3
Phone = 8
Unknown = 0
End Enum
4.加入全域變數及建構函式。
'VB的語法可以使用WithEvents關鍵字,這樣就可以在下拉式選單中選擇事件,
'不需要自己寫事件的繫結程式碼
Dim WithEvents msgr As Messenger
Dim status As OnlineStatusEnum = OnlineStatusEnum.Unknown
Public Sub New(ByVal account As String, ByVal pwd As String)
Me.New(account, pwd, OnlineStatusEnum.Online)
End Sub
Public Sub New(ByVal account As String, ByVal pwd As String, ByVal status As OnlineStatusEnum)
msgr = New Messenger
msgr.Credentials = New Credentials(account, pwd)
Me.status = status
AddHandler msgr.Nameserver.SignedIn, AddressOf SignedIn
msgr.Connect()
End Sub
5.加入機器人登入後狀態改變的事件,這個步驟非常重要!
Private Sub SignedIn(ByVal sender As Object, ByVal e As EventArgs)
msgr.ContactList.Owner.Status = status
End Sub
6.加入查詢聯絡人在線狀態的函式。
Public Function GetContactStatus(ByVal account As String) As OnlineStatusEnum
Dim contact As Contact = msgr.ContactList.GetContact(account)
If contact Is Nothing Then Return CType(PresenceStatus.Unknown, OnlineStatusEnum)
Return contact.Status
End Function
7.加入發送訊息的函式。
Public Sub SendMsg(ByVal account As String, ByVal msg As String)
Dim contact As Contact = Msgr.ContactList.GetContact(account)
Dim txtMsg As New TextMessage(msg)
Dim conversation As Conversation = Msgr.CreateConversation
If contact Is Nothing Then Exit Sub
If contact.Online Then
conversation.Invite(contact)
conversation.SendTextMessage(txtMsg)
End If
End Sub
8.最後,加入其它一些輔助的屬性和函式。
Public Property OnlineStatus As OnlineStatusEnum
Get
Return status
End Get
Set(ByVal value As OnlineStatusEnum)
status = value
End Set
End Property
Public ReadOnly Property IsConnected As Boolean
Get
Return msgr.Connected
End Get
End Property
Public ReadOnly Property Account As String
Get
Return msgr.Credentials.Account
End Get
End Property
Public Sub Connect()
If Not IsConnected Then Msgr.Connect()
End Sub
最後只需要在Global.asax中的Application_Start中New這個Class,再把它放到Application中就可以了,只要網站的Thread還活著(Alive),那麼這個機器人就會一直在線上,這部份純粹是網站結合MSN機器人的應用需求。
Application("MSNRobot") = New MSNRobot("帳號", "密碼")
實作簡單的MSN機器人系列文章:
實作一個簡單的MSN機器人
實作一個簡單的MSN機器人-2
實作一個簡單的MSN機器人-3
實作一個簡單的MSN機器人-4
實作一個簡單的MSN機器人-5